JaeHyeonKim19

프로그래머스 더 맵게

2019-12-27


자체풀이

import java.util.*;
class Solution {
    public int solution(int[] scoville, int K) {
        int answer = 0;
        ArrayList<Integer> scovilleList = new ArrayList<Integer>();

        for(int scovilleItem:scoville){
            scovilleList.add(scovilleItem);
        }
        int criteria = scovilleList.get(0);
        while(criteria<K && scovilleList.size()>1){
            answer++;
            int easiestOne = scovilleList.remove(0);
            int secondaryOne = scovilleList.remove(0);
            int newOne = easiestOne + secondaryOne*2;
            scovilleList.add(0, newOne);
            for(int i = 1;i<scovilleList.size();i++){
                if(scovilleList.get(i-1)>scovilleList.get(i)){
                    int temp = scovilleList.remove(i);
                    scovilleList.add(i-1, temp);
                }else{
                    break;
                }
            }
            criteria = scovilleList.get(0);
        }

        if(scovilleList.size()==1 && criteria<K){
            return -1;
        }
        return answer;
    }
}
  • 결과

    • 정확성: 2, 3, 7, 10, 15 실패
    • 효율성: 전체 실패

자체풀이2(다 합쳐도 K를 넘을 수 없는 경우 추가)

import java.util.*;
class Solution {
    public int solution(int[] scoville, int K) {
        int answer = 0;
        ArrayList<Integer> scovilleList = new ArrayList<Integer>();

        for(int scovilleItem:scoville){
            scovilleList.add(scovilleItem);
        }
        scovilleList.sort(null);
        int criteria = scovilleList.get(0);
        while(criteria<K && scovilleList.size()>1){
            answer++;
            int easiestOne = scovilleList.remove(0);
            int secondaryOne = scovilleList.remove(0);
            int newOne = easiestOne + secondaryOne*2;
            scovilleList.add(0, newOne);
            for(int i = 1;i<scovilleList.size();i++){
                if(scovilleList.get(i-1)>scovilleList.get(i)){
                    int temp = scovilleList.remove(i);
                    scovilleList.add(i-1, temp);
                }else{
                    break;
                }
            }
            criteria = scovilleList.get(0);
        }

        if(scovilleList.size()==1 && criteria<K){
            return -1;
        }
        return answer;
    }
}
  • 결과

    • 정확성: 전체 통과
    • 효율성: 전체 실패

min Heap의 일부를 직접 구현

class Solution {
    int [] orderedScoville;
    int currentIndex = -1;

    void offer(int newVal){
        currentIndex++;
        orderedScoville[currentIndex] = newVal;
        int temp = currentIndex;
        while(temp!=0){
            if(orderedScoville[temp]<orderedScoville[(temp+1)/2-1]){
                int changingTemp = orderedScoville[(temp+1)/2-1];
                orderedScoville[(temp+1)/2-1] = orderedScoville[temp];
                orderedScoville[temp] = changingTemp;
                temp = (temp+1)/2-1;
            }else{
                break;
            }
        }
    }

    int poll(){
        int returnValue = orderedScoville[0];
        orderedScoville[0] = orderedScoville[currentIndex];
        orderedScoville[currentIndex] = 0;
        currentIndex--;
        int temp = 0;
        while(true){
        	int smallChildIndex = 0;
        	int firstChildIndex = (temp+1)*2-1;
        	int secondChildIndex = (temp+1)*2;
        	if(firstChildIndex<=currentIndex && secondChildIndex<=currentIndex) {
            	smallChildIndex = orderedScoville[firstChildIndex]>orderedScoville[secondChildIndex]?secondChildIndex:firstChildIndex;
            }else if(firstChildIndex<=currentIndex && secondChildIndex>currentIndex) {
            	smallChildIndex = firstChildIndex;
            }else {
            	break;
            }
            if(orderedScoville[temp]>orderedScoville[smallChildIndex]){
                int changingTemp = orderedScoville[smallChildIndex];
                orderedScoville[smallChildIndex] = orderedScoville[temp];
                orderedScoville[temp] = changingTemp;
                temp = smallChildIndex;
            }else{
                break;
            }
        }
        return returnValue;
    }

    public int solution(int[] scoville, int K) {
        int answer = 0;
        orderedScoville = new int[scoville.length];
        for(int i = 0;i<scoville.length;i++)
            offer(scoville[i]);
        while(orderedScoville[0]<K && currentIndex>0){
            answer++;
            offer(poll()+poll()*2);
        }
        if(currentIndex==0&&orderedScoville[0]<K)
            return -1;
        return answer;
    }
}
  • 결과

    • 정확성: 전체 통과
    • 효율성: 전체 통과

min Heap을 응용하여 구현된 우선순위 큐를 활용한 풀이

import java.util.*;
class Solution {
    public int solution(int[] scoville, int K) {
        int answer = 0;
        PriorityQueue<Integer> scovillePriorityQueue = new PriorityQueue<Integer>();
        for(int scovilleValue:scoville)
            scovillePriorityQueue.offer(scovilleValue);
        while(scovillePriorityQueue.peek()<K && scovillePriorityQueue.size()>1){
            answer++;
            scovillePriorityQueue.offer(scovillePriorityQueue.poll()+scovillePriorityQueue.poll()*2);
        }
        if(scovillePriorityQueue.size()==1 && scovillePriorityQueue.peek()<K)
            return -1;
        return answer;
    }
}
  • 결과

    • 정확성: 전체 통과
    • 효율성: 전체 통과